<?xml version='1.0' encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html lang="en" xml:lang="en" xmlns="http://www.w3.org/1999/xhtml">
  <head>
    <link href="cpip.css" rel="stylesheet" type="text/css" />
    <title>File: /Users/paulross/dev/linux/linux-3.13/include/linux/lockref.h</title>
  </head>
  <body>
    <h1>File: /Users/paulross/dev/linux/linux-3.13/include/linux/lockref.h</h1>
    <p>Green shading in the line number column
means the source is part of the translation unit, red means it is conditionally excluded.
Highlighted line numbers link to the translation unit page. Highlighted macros link to
the macro page.</p>
    <pre><a name="1" /><span class="True">       1:</span> <span class="f">#</span><span class="n">ifndef</span> <a href="cpu.c_macros_noref.html#_X19MSU5VWF9MT0NLUkVGX0hfMA__"><span class="b">__LINUX_LOCKREF_H</span></a>
<a name="2" /><span class="True">       2:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_X19MSU5VWF9MT0NLUkVGX0hfMA__"><span class="b">__LINUX_LOCKREF_H</span></a>
<a name="3" /><span class="True">       3:</span> 
<a name="4" /><span class="True">       4:</span> <span class="k">/*</span>
<a name="5" /><span class="True">       5:</span> <span class="k"> * Locked reference counts.</span>
<a name="6" /><span class="True">       6:</span> <span class="k"> *</span>
<a name="7" /><span class="True">       7:</span> <span class="k"> * These are different from just plain atomic refcounts in that they</span>
<a name="8" /><span class="True">       8:</span> <span class="k"> * are atomic with respect to the spinlock that goes with them.  In</span>
<a name="9" /><span class="True">       9:</span> <span class="k"> * particular, there can be implementations that don&apos;t actually get</span>
<a name="10" /><span class="True">      10:</span> <span class="k"> * the spinlock for the common decrement/increment operations, but they</span>
<a name="11" /><span class="True">      11:</span> <span class="k"> * still have to check that the operation is done semantically as if</span>
<a name="12" /><span class="True">      12:</span> <span class="k"> * the spinlock had been taken (using a cmpxchg operation that covers</span>
<a name="13" /><span class="True">      13:</span> <span class="k"> * both the lock and the count word, or using memory transactions, for</span>
<a name="14" /><span class="True">      14:</span> <span class="k"> * example).</span>
<a name="15" /><span class="True">      15:</span> <span class="k"> */</span>
<a name="16" /><span class="True">      16:</span> 
<a name="17" /><span class="True">      17:</span> <span class="f">#</span><span class="n">include</span> <span class="f">&lt;</span><span class="b">linux</span><span class="f">/</span><span class="b">spinlock</span><span class="f">.</span><span class="b">h</span><span class="f">&gt;</span>
<a name="18" /><span class="True">      18:</span> <span class="f">#</span><span class="n">include</span> <span class="f">&lt;</span><span class="b">generated</span><span class="f">/</span><span class="b">bounds</span><span class="f">.</span><span class="b">h</span><span class="f">&gt;</span>
<a name="19" /><span class="True">      19:</span> 
<a name="20" /><span class="True">      20:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_ref.html#_VVNFX0NNUFhDSEdfTE9DS1JFRl8w"><span class="b">USE_CMPXCHG_LOCKREF</span></a> \
<a name="21" /><span class="True">      21:</span>     <span class="f">(</span><a href="cpu.c_macros_ref.html#_SVNfRU5BQkxFRF8w"><span class="b">IS_ENABLED</span></a><span class="f">(</span><a href="cpu.c_macros_ref.html#_Q09ORklHX0FSQ0hfVVNFX0NNUFhDSEdfTE9DS1JFRl8w"><span class="b">CONFIG_ARCH_USE_CMPXCHG_LOCKREF</span></a><span class="f">)</span> <span class="f">&amp;&amp;</span> \
<a name="22" /><span class="True">      22:</span>      <a href="cpu.c_macros_ref.html#_SVNfRU5BQkxFRF8w"><span class="b">IS_ENABLED</span></a><span class="f">(</span><a href="cpu.c_macros_ref.html#_Q09ORklHX1NNUF8w"><span class="b">CONFIG_SMP</span></a><span class="f">)</span> <span class="f">&amp;&amp;</span> <a href="cpu.c_macros_ref.html#_U1BJTkxPQ0tfU0laRV8w"><span class="b">SPINLOCK_SIZE</span></a> <span class="f">&lt;=</span> <span class="c">4</span><span class="f">)</span>
<a name="23" /><span class="True">      23:</span> 
<a name="24" /><span class="True">      24:</span> <span class="m">struct</span> <span class="b">lockref</span> <span class="f">{</span>
<a name="25" /><span class="True">      25:</span>     <span class="m">union</span> <span class="f">{</span>
<a name="26" /><span class="True">      26:</span> <span class="f">#</span><span class="n">if</span> <a href="cpu.c_macros_ref.html#_VVNFX0NNUFhDSEdfTE9DS1JFRl8w"><span class="b">USE_CMPXCHG_LOCKREF</span></a>
<a name="27" /><span class="True">      27:</span>         <a href="cpu.c_macros_ref.html#_YWxpZ25lZF91NjRfMA__"><span class="b">aligned_u64</span></a> <span class="b">lock_count</span><span class="f">;</span>
<a name="28" /><span class="True">      28:</span> <span class="f">#</span><span class="n">endif</span>
<a name="29" /><span class="True">      29:</span>         <span class="m">struct</span> <span class="f">{</span>
<a name="30" /><span class="True">      30:</span>             <span class="b">spinlock_t</span> <span class="b">lock</span><span class="f">;</span>
<a name="31" /><span class="True">      31:</span>             <span class="m">unsigned</span> <span class="m">int</span> <span class="b">count</span><span class="f">;</span>
<a name="32" /><span class="True">      32:</span>         <span class="f">}</span><span class="f">;</span>
<a name="33" /><span class="True">      33:</span>     <span class="f">}</span><span class="f">;</span>
<a name="34" /><span class="True">      34:</span> <span class="f">}</span><span class="f">;</span>
<a name="35" /><span class="True">      35:</span> 
<a name="36" /><span class="True">      36:</span> <span class="m">extern</span> <span class="m">void</span> <span class="b">lockref_get</span><span class="f">(</span><span class="m">struct</span> <span class="b">lockref</span> <span class="f">*</span><span class="f">)</span><span class="f">;</span>
<a name="37" /><span class="True">      37:</span> <span class="m">extern</span> <span class="m">int</span> <span class="b">lockref_get_not_zero</span><span class="f">(</span><span class="m">struct</span> <span class="b">lockref</span> <span class="f">*</span><span class="f">)</span><span class="f">;</span>
<a name="38" /><span class="True">      38:</span> <span class="m">extern</span> <span class="m">int</span> <span class="b">lockref_get_or_lock</span><span class="f">(</span><span class="m">struct</span> <span class="b">lockref</span> <span class="f">*</span><span class="f">)</span><span class="f">;</span>
<a name="39" /><span class="True">      39:</span> <span class="m">extern</span> <span class="m">int</span> <span class="b">lockref_put_or_lock</span><span class="f">(</span><span class="m">struct</span> <span class="b">lockref</span> <span class="f">*</span><span class="f">)</span><span class="f">;</span>
<a name="40" /><span class="True">      40:</span> 
<a name="41" /><span class="True">      41:</span> <span class="m">extern</span> <span class="m">void</span> <span class="b">lockref_mark_dead</span><span class="f">(</span><span class="m">struct</span> <span class="b">lockref</span> <span class="f">*</span><span class="f">)</span><span class="f">;</span>
<a name="42" /><span class="True">      42:</span> <span class="m">extern</span> <span class="m">int</span> <span class="b">lockref_get_not_dead</span><span class="f">(</span><span class="m">struct</span> <span class="b">lockref</span> <span class="f">*</span><span class="f">)</span><span class="f">;</span>
<a name="43" /><span class="True">      43:</span> 
<a name="44" /><span class="True">      44:</span> <span class="k">/* Must be called under spinlock for reliable results */</span>
<a name="45" /><span class="True">      45:</span> <span class="m">static</span> <span class="m">inline</span> <span class="m">int</span> <span class="b">__lockref_is_dead</span><span class="f">(</span><span class="m">const</span> <span class="m">struct</span> <span class="b">lockref</span> <span class="f">*</span><span class="b">l</span><span class="f">)</span>
<a name="46" /><span class="True">      46:</span> <span class="f">{</span>
<a name="47" /><span class="True">      47:</span>     <span class="m">return</span> <span class="f">(</span><span class="f">(</span><span class="m">int</span><span class="f">)</span><span class="b">l</span><span class="f">-&gt;</span><span class="b">count</span> <span class="f">&lt;</span> <span class="c">0</span><span class="f">)</span><span class="f">;</span>
<a name="48" /><span class="True">      48:</span> <span class="f">}</span>
<a name="49" /><span class="True">      49:</span> 
<a name="50" /><span class="True">      50:</span> <span class="f">#</span><span class="n">endif</span> <span class="k">/* __LINUX_LOCKREF_H */</span>
<a name="51" /><span class="True">      51:</span> </pre>
  </body>
</html>
